import dayjs from 'dayjs'
import { FILE_UPLOAD_CONFIG } from './constants'

/**
 * 格式化日期时间
 * @param {string|Date} date 日期
 * @param {string} format 格式
 * @returns {string}
 */
export function formatDateTime(date, format = 'YYYY-MM-DD HH:mm:ss') {
  if (!date) return ''
  return dayjs(date).format(format)
}

/**
 * 格式化文件大小
 * @param {number} bytes 字节数
 * @returns {string}
 */
export function formatFileSize(bytes) {
  if (!bytes) return '0 B'
  
  const k = 1024
  const sizes = ['B', 'KB', 'MB', 'GB', 'TB']
  const i = Math.floor(Math.log(bytes) / Math.log(k))
  
  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]
}

/**
 * 验证文件类型和大小
 * @param {File} file 文件对象
 * @param {Object} options 验证选项
 * @returns {Object} { valid: boolean, message: string }
 */
export function validateFile(file, options = {}) {
  const {
    maxSize = 30 * 1024 * 1024, // 30MB
    allowedTypes = ['.pdf', '.doc', '.docx']
  } = options
  
  if (!file) {
    return { valid: false, message: '请选择文件' }
  }
  
  // 检查文件类型
  const fileExtension = '.' + file.name.split('.').pop().toLowerCase()
  if (!allowedTypes.includes(fileExtension)) {
    return { valid: false, message: `只支持 ${allowedTypes.join('、')} 格式文件` }
  }
  
  // 检查文件大小
  if (file.size > maxSize) {
    return { valid: false, message: `文件大小不能超过${formatFileSize(maxSize)}，否则将无法上传` }
  }
  
  return { valid: true, message: '' }
}

/**
 * 根据相似度计算风险等级
 * @param {number} similarity 相似度
 * @returns {string}
 */
export function calculateRiskLevel(similarity) {
  if (similarity < 15) return 'low'
  if (similarity < 30) return 'medium'
  return 'high'
}

/**
 * 防抖函数
 * @param {Function} func 要防抖的函数
 * @param {number} wait 等待时间
 * @returns {Function}
 */
export function debounce(func, wait) {
  let timeout
  return function executedFunction(...args) {
    const later = () => {
      clearTimeout(timeout)
      func(...args)
    }
    clearTimeout(timeout)
    timeout = setTimeout(later, wait)
  }
}

/**
 * 节流函数
 * @param {Function} func 要节流的函数
 * @param {number} limit 限制时间
 * @returns {Function}
 */
export function throttle(func, limit) {
  let inThrottle
  return function() {
    const args = arguments
    const context = this
    if (!inThrottle) {
      func.apply(context, args)
      inThrottle = true
      setTimeout(() => inThrottle = false, limit)
    }
  }
}

/**
 * 深拷贝对象
 * @param {*} obj 要拷贝的对象
 * @returns {*}
 */
export function deepClone(obj) {
  if (obj === null || typeof obj !== 'object') return obj
  if (obj instanceof Date) return new Date(obj.getTime())
  if (obj instanceof Array) return obj.map(item => deepClone(item))
  if (typeof obj === 'object') {
    const clonedObj = {}
    for (const key in obj) {
      if (obj.hasOwnProperty(key)) {
        clonedObj[key] = deepClone(obj[key])
      }
    }
    return clonedObj
  }
}

/**
 * 生成随机字符串
 * @param {number} length 长度
 * @returns {string}
 */
export function generateRandomString(length = 8) {
  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
  let result = ''
  for (let i = 0; i < length; i++) {
    result += chars.charAt(Math.floor(Math.random() * chars.length))
  }
  return result
}

/**
 * 计算百分比
 * @param {number} current 当前值
 * @param {number} total 总值
 * @param {number} decimal 小数位数
 * @returns {number}
 */
export function calculatePercentage(current, total, decimal = 1) {
  if (!total || total === 0) return 0
  return Number(((current / total) * 100).toFixed(decimal))
}


/**
 * 计算两个日期之间的天数差
 * @param {Date} date1 日期1
 * @param {Date} date2 日期2
 * @returns {number} 天数差
 */
export function getDaysDifference(date1, date2) {
  const timeDiff = Math.abs(date2.getTime() - date1.getTime())
  return Math.ceil(timeDiff / (1000 * 3600 * 24))
}